home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / ShapeShifter / VideoDrivers / SD64evd / SD64evd.asm < prev    next >
Assembly Source File  |  1996-06-03  |  13KB  |  703 lines

  1. *
  2. * SD64evd.asm - ShapeShifter external video driver for PiccoloSD64
  3. *
  4. * $VER: SD64evd.asm 1.0 (20.05.96)
  5. *
  6. * By Francesco Doro (fdoro@gpnet.it)
  7. *
  8.  
  9.     incdir    "INCLUDE_I:"
  10.         
  11.     INCLUDE    "exec/types.i"
  12.     INCLUDE    "exec/macros.i"
  13.     INCLUDE    "exec/memory.i"
  14.     INCLUDE    "intuition/intuition.i"
  15.     INCLUDE    "utility/tagitem.i"
  16.     INCLUDE    "exec/alerts.i"
  17.     INCLUDE    "shapeextvideo.i"
  18.  
  19. *
  20. * Definition of our private context structure for storing local variables
  21. *
  22.  
  23.  STRUCTURE    MyContext,0
  24.     APTR    conIntBase
  25.     APTR    conGfxBase
  26.     APTR    conDOSBase
  27.     APTR    conExpBase
  28.  
  29.     APTR    conScreen    ;The screen
  30.     APTR    conViewPort    ;The screen's ViewPort
  31.     APTR    conBitMap    ;The screen's RastPort
  32.  
  33.     APTR    conVirtualMem    ;Buffer base in SD64 memory
  34.     APTR    conDisplayMem    ;Display base in SD64 memory
  35.     APTR    conBLTSource    ;Source start address for blitter
  36.     APTR    conSD64reg    ;Base of SD64 registers
  37.     WORD    con4Meg        ;Flag for 4 meg boards
  38.     WORD    conBLTWidth    ;Width of the blit
  39.     WORD    conBLTHeight    ;Height of the blit
  40.  
  41.     WORD    conVideoMode    ;Video mode (VMODE_*)
  42.  
  43.  LABEL    MyContext_SIZEOF
  44.  
  45. *
  46. * This is the driver header
  47. *
  48.  
  49.         EVHEADER DriverTags
  50.  
  51. *
  52. * The header tags that describe the driver and provide pointers to
  53. * the driver's routines
  54. *
  55.  
  56. DriverTags    dc.l    SHEV_Level,1        ;Interface level 1
  57.         dc.l    SHEV_Version,1
  58.         dc.l    SHEV_Revision,0
  59.         dc.l    SHEV_Name,DriverName
  60.         dc.l    SHEV_ID,DriverID
  61.         dc.l    SHEV_Author,DriverAuthor
  62.  
  63.         dc.l    SHEV_OpenScreen,MyOpenScreen
  64.         dc.l    SHEV_CloseScreen,MyCloseScreen
  65.         dc.l    SHEV_Refresh,Refresh
  66.         dc.l    TAG_END,0
  67.  
  68. DriverName    dc.b    "PiccoloSD64 24 bit Driver",0
  69.         CNOP    0,4
  70. DriverID    dc.b    "$VER: SD64evd 1.0 by Francesco Doro (20.05.96)",13,10,0
  71.         CNOP    0,4
  72. DriverAuthor    dc.b    "Francesco Doro (fdoro@gpnet.it)",0
  73.         CNOP    0,4
  74.  
  75.  
  76. *****************
  77. **   REFRESH   **
  78. *****************
  79. * a2: Context pointer (never NULL)
  80.  
  81. * Since the SD64 pixel format is RGBX while Mac's one is XRGB
  82. * we only have to do a copy from offset #1 of the Mac's display memory
  83. * to offset #0 of the real display memory. This is difficult to do for CPU
  84. * but easy for the blitter, since it doesn't care about odd or even address.
  85. * Sorry for multitasking and vblank disabled; must be sure nothing accesses
  86. * video memory during the blit.
  87.  
  88. Refresh
  89.         movem.l    d2-d7/a2-a6,-(sp)
  90.         move.l    4,a6
  91.         jsr    -132(a6)        ;Forbid
  92.         move.w    $dff01c,d0
  93.         andi.w    #$0020,d0
  94.         ori.w    #$8000,d0
  95.         move.w    d0,-(a7)
  96.         move.w    #$0020,$dff09a        ;disable vblank irq
  97.  
  98.         move.l    conSD64reg(a2),a0
  99.  
  100.         move.w    #$1f1e,$3c4(a0)        ;MCLK
  101.         move.w    #$3104,$3ce(a0)        ;reset blitter
  102.  
  103.         move.w    conBLTWidth(a2),d0    ;source pitch
  104.         move.w    #$2600,d1
  105.         move.b    d0,d1
  106.         move.w    d1,$3ce(a0)
  107.         move.b    #$27,d0
  108.         ror.w    #8,d0
  109.         move.w    d0,$3ce(a0)
  110.  
  111.         move.w    conBLTWidth(a2),d0    ;dest pitch
  112.         move.w    #$2400,d1
  113.         move.b    d0,d1
  114.         move.w    d1,$3ce(a0)
  115.         move.b    #$25,d0
  116.         ror.w    #8,d0
  117.         move.w    d0,$3ce(a0)
  118.  
  119.         move.w    conBLTWidth(a2),d0    ;width
  120.         subq.w    #1,d0
  121.         move.w    #$2000,d1
  122.         move.b    d0,d1
  123.         move.w    d1,$3ce(a0)
  124.         move.b    #$21,d0
  125.         ror.w    #8,d0
  126.         move.w    d0,$3ce(a0)
  127.  
  128.         move.w    conBLTHeight(a2),d0    ;height
  129.         subq.w    #1,d0
  130.         move.w    #$2200,d1
  131.         move.b    d0,d1
  132.         move.w    d1,$3ce(a0)
  133.         move.b    #$23,d0
  134.         ror.w    #8,d0
  135.         move.w    d0,$3ce(a0)
  136.  
  137.         move.l    #0,d0            ;dest address
  138.         move.w    #$2800,d1
  139.         move.b    d0,d1
  140.         move.w    d1,$3ce(a0)
  141.         move.b    #$29,d0
  142.         ror.w    #8,d0
  143.         move.w    d0,$3ce(a0)
  144.         swap    d0
  145.         move.w    #$2a00,d1
  146.         move.b    d0,d1
  147.         move.w    d1,$3ce(a0)
  148.  
  149.         move.l    conBLTSource(a2),d0    ;source address
  150.         move.w    #$2c00,d1
  151.         move.b    d0,d1
  152.         move.w    d1,$3ce(a0)
  153.         move.b    #$2d,d0
  154.         ror.w    #8,d0
  155.         move.w    d0,$3ce(a0)
  156.         swap    d0
  157.         move.w    #$2e00,d1
  158.         move.b    d0,d1
  159.         move.w    d1,$3ce(a0)
  160.  
  161.         move.w    #$3000,$3ce(a0)        ;BLT mode
  162.         move.w    #$2f00,$3ce(a0)        ;write mask
  163.         move.w    #$320d,$3ce(a0)        ;BLT operation (copy from source)
  164.         move.w    #$3102,$3ce(a0)        ;go!
  165.  
  166.         move.b    #$31,$3ce(a0)        ;We must wait until
  167. waitblt        nop                ;blitter finish, no good
  168.         nop                ;to access video memory
  169.         nop                ;during a blit
  170.         nop
  171.         btst    #3,$3cf(a0)
  172.         bne.s    waitblt
  173.  
  174.         move.w    (a7)+,$dff09a
  175.         move.l    4,a6
  176.         jsr    -138(a6)        ;Permit
  177.         movem.l    (sp)+,d2-d7/a2-a6
  178.         moveq    #0,d0
  179.         rts
  180.  
  181.  
  182. *
  183. * The OpenScreen routine
  184. * a0: Taglist with input parameters
  185. * a1: Taglist with output parameters
  186. * a6: Base of utility.library
  187. *
  188.  
  189. MyOpenScreen    movem.l    d2-d7/a2-a6,-(sp)
  190.         move.l    a0,a4            ;a4: Input taglist
  191.         move.l    a1,a5            ;a5: Output taglist
  192.         move.l    a6,d7            ;d7: UtilityBase
  193.  
  194.  
  195. ; Allocate memory for context
  196.  
  197.         move.l    4,a6
  198.         move.l    #MyContext_SIZEOF,d0
  199.         move.l    #$00010001,d1
  200.         jsr    -684(a6)        :AllocVec
  201.         tst.l    d0
  202.         beq    OpenFailed1
  203.         move.l    d0,a2            ;a2: Context
  204.  
  205.  
  206. ; Open intuition.library
  207.  
  208.         move.l    4,a6
  209.         lea    IntName(pc),a1
  210.         moveq    #37,d0
  211.         jsr    -552(a6)        ;OpenLibrary
  212.         move.l    d0,conIntBase(a2)
  213.         beq    OpenFailed2
  214.  
  215.  
  216. ; Open graphics.library
  217.  
  218.         move.l    4,a6
  219.         lea    GfxName(pc),a1
  220.         moveq    #37,d0
  221.         jsr    -552(a6)        ;OpenLibrary
  222.         move.l    d0,conGfxBase(a2)
  223.         beq    OpenFailed3
  224.  
  225.  
  226. ; Open dos.library
  227.  
  228.         move.l    4,a6
  229.         lea    DOSName(pc),a1
  230.         moveq    #37,d0
  231.         jsr    -552(a6)        ;OpenLibrary
  232.         move.l    d0,conDOSBase(a2)
  233.         beq    OpenFailed4
  234.  
  235.  
  236. ; Open expansion.library
  237.  
  238.         move.l    4,a6
  239.         lea    ExpName(pc),a1
  240.         moveq    #0,d0
  241.         jsr    -552(a6)        ;OpenLibrary
  242.         move.l    d0,conExpBase(a2)
  243.         beq    OpenFailed12
  244.  
  245.  
  246. ; Check board and get video memory address
  247.  
  248.         move.l    conExpBase(a2),a6
  249.         suba.l    a0,a0
  250.         move.l    #$893,d0
  251.         moveq    #10,d1
  252.         jsr    -72(a6)            ;FindConfigDev
  253.         tst.l    d0
  254.         beq    OpenFailed13
  255.         move.l    d0,a0
  256.         move.l    $20(a0),d0
  257.         move.l    d0,conDisplayMem(a2)
  258.         beq    OpenFailed13
  259.         addi.l    #$100000,d0
  260.         move.l    d0,conVirtualMem(a2)
  261.         move.l    #$100000,conBLTSource(a2)
  262.         move.w    #0,con4Meg(a2)
  263.         move.l    $24(a0),d0
  264.         cmpi.l    #$01000000,d0        ;is the size 4 Meg?
  265.         bne.s    findreg
  266.         move.w    #1,con4Meg(a2)
  267.  
  268. findreg        move.l    conExpBase(a2),a6
  269.         suba.l    a0,a0
  270.         move.l    #$893,d0
  271.         moveq    #11,d1
  272.         jsr    -72(a6)            ;FindConfigDev
  273.         tst.l    d0
  274.         beq    OpenFailed13
  275.         move.l    d0,a0
  276.         move.l    $20(a0),d0
  277.         move.l    d0,conSD64reg(a2)
  278.         beq    OpenFailed13
  279.  
  280.  
  281. ; Verify whether really this is a 4 meg SD64
  282.  
  283.         tst.w    con4Meg(a2)
  284.         beq.s    no4
  285.         movea.l    conDisplayMem(a2),a0
  286.         move.l    a0,a1
  287.         adda.l    #$200000,a1
  288.         move.l    #$ff,d0
  289.         moveq    #0,d1
  290. chk.1        move.l    d0,(a0)+
  291.         nop
  292.         nop
  293.         nop
  294.         nop
  295.         nop
  296.         nop
  297.         nop
  298.         nop
  299.         move.l    d1,(A1)+
  300.         nop
  301.         nop
  302.         nop
  303.         nop
  304.         nop
  305.         nop
  306.         nop
  307.         nop
  308.         addq.l    #1,d1
  309.         dbra    d0,chk.1
  310.         movea.l    conDisplayMem(a2),a0
  311.         move.l    a0,a1
  312.         adda.l    #$200000,a1
  313.         move.l    #$ff,d0
  314.         moveq    #0,d1
  315. chk.2        cmp.l    (a0)+,d0
  316.         bne.s    chk.3
  317.         cmp.l    (a1)+,d1
  318.         bne.s    chk.3
  319.         addq.l    #1,d1
  320.         dbra    d0,chk.2
  321.         bra.s    chk.4
  322.  
  323. chk.3        move.w    #0,con4Meg(a2)
  324. chk.4        tst.w    con4Meg(a2)
  325.         beq.s    no4
  326.         addi.l    #$100000,conVirtualMem(a2)
  327.         addi.l    #$100000,conBLTSource(a2)
  328. no4        addq.l    #1,conBLTSource(a2)
  329.  
  330.  
  331. ; Store context pointer in output taglist
  332.  
  333.         move.l    d7,a6
  334.         move.l    a5,a0
  335.         move.l    #SHEV_Context,d0
  336.         jsr    -30(a6)        ;FindTagItem
  337.         move.l    d0,a0
  338.         move.l    a2,ti_Data(a0)
  339.  
  340.  
  341.  
  342. ; Get video mode and set the refresh type and screen depth accordingly
  343. ; This driver only supports VMODE_24BIT
  344.  
  345.         move.l    d7,a6
  346.         move.l    a4,a0
  347.         move.l    #SHEV_VideoMode,d0
  348.         jsr    -36(a6)        ;GetTagData
  349.         move.w    d0,conVideoMode(a2)
  350.         cmp.l    #VMODE_24BIT,d0
  351.         bne    OpenFailed5
  352.         move.l    a5,a0
  353.         move.l    #SHEV_RefreshType,d0
  354.         jsr    -30(a6)        ;FindTagItem
  355.         tst.l    d0
  356.         beq    OpenFailed6
  357.         move.l    d0,a1
  358.         move.l    #RTYPE_CUSTOM,ti_Data(a1)
  359.         move.l    #24,ScrDepth
  360.  
  361.  
  362. ; Extract screen parameters from input taglist
  363.  
  364.         move.l    d7,a6
  365.         move.l    a4,a0
  366.         move.l    #SHEV_ScreenX,d0
  367.         moveq    #0,d1
  368.         jsr    -36(a6)        ;GetTagData
  369.         move.l    d0,ScrWidth
  370.         move.l    d0,-(a7)
  371.         lsl.l    #2,d0
  372.         move.w    d0,conBLTWidth(a2)
  373.  
  374.         move.l    a4,a0
  375.         move.l    #SHEV_ScreenY,d0
  376.         moveq    #0,d1
  377.         jsr    -36(a6)        ;GetTagData
  378.         move.l    d0,ScrHeight
  379.         move.w    d0,conBLTHeight(a2)
  380.         move.l    d0,d1
  381.         move.l    (a7)+,d0
  382.         swap    d0
  383.         move.w    d1,d0
  384.  
  385.         cmpi.l    #$02000180,d0
  386.         beq.s    s512x384
  387.         cmpi.l    #$024001b0,d0
  388.         beq.s    s576x432
  389.         cmpi.l    #$02800190,d0
  390.         beq.s    s640x400
  391.         cmpi.l    #$028001e0,d0
  392.         beq.s    s640x480
  393.         cmpi.l    #$03000240,d0
  394.         beq.s    s768x576
  395.         cmpi.l    #$03200258,d0
  396.         beq.s    s800x600
  397.         cmpi.l    #$03400270,d0
  398.         beq.s    s832x624
  399.  
  400.         bra    OpenFailed7
  401.  
  402. s512x384
  403.         bra.s    okscr
  404.  
  405. s576x432
  406.         bra.s    okscr
  407.  
  408. s640x400
  409.         bra.s    okscr
  410.  
  411. s640x480
  412.         tst.w    con4Meg(a2)
  413.         beq    OpenFailed8
  414.         bra.s    okscr
  415.  
  416. s768x576
  417.         tst.w    con4Meg(a2)
  418.         beq    OpenFailed8
  419.         bra.s    okscr
  420.  
  421. s800x600
  422.         tst.w    con4Meg(a2)
  423.         beq    OpenFailed8
  424.         bra.s    okscr
  425.  
  426. s832x624
  427.         tst.w    con4Meg(a2)
  428.         beq    OpenFailed8
  429.         bra.s    okscr
  430.  
  431.         nop
  432. okscr        move.l    a4,a0
  433.         move.l    #SHEV_DisplayID,d0
  434.         moveq    #0,d1
  435.         jsr    -36(a6)        ;GetTagData
  436.         move.l    d0,ScrDisplayID
  437.  
  438.         move.l    a4,a0
  439.         move.l    #SHEV_OverscanType,d0
  440.         moveq    #OSCAN_TEXT,d1
  441.         jsr    -36(a6)        ;GetTagData
  442.         move.l    d0,ScrOverscan
  443.  
  444.  
  445. ; Open the screen and store pointer in output taglist
  446.  
  447.         move.l    conIntBase(a2),a6
  448.         sub.l    a0,a0
  449.         lea    ScreenTags,a1
  450.         jsr    -612(a6)    ;OpenScreenTagList
  451.         move.l    d0,a3        ;a3: Screen
  452.         move.l    d0,conScreen(a2)
  453.         beq    OpenFailed9
  454.  
  455. ScreenOpened    move.l    d7,a6
  456.         move.l    a5,a0
  457.         move.l    #SHEV_Screen,d0
  458.         jsr    -30(a6)        ;FindTagItem
  459.         move.l    d0,a0
  460.         move.l    a3,ti_Data(a0)
  461.  
  462.  
  463. ; Extract our private data
  464.  
  465.         lea    sc_ViewPort(a3),a0
  466.         move.l    a0,conViewPort(a2)
  467.         lea    sc_RastPort(a3),a0
  468.         move.l    rp_BitMap(a0),conBitMap(a2)
  469.  
  470.  
  471. ; Extract all the other data that the caller wants
  472.  
  473.         move.l    d7,a6
  474.         move.l    a5,a0
  475.         move.l    #SHEV_ScreenBase,d0
  476.         jsr    -30(a6)        ;FindTagItem
  477.         tst.l    d0
  478.         beq    OpenFailed10
  479.         move.l    d0,a1
  480.         move.l    conVirtualMem(a2),ti_Data(a1)
  481.  
  482.         move.l    d7,a6
  483.         move.l    a5,a0
  484.         move.l    #SHEV_BytesPerRow,d0
  485.         jsr    -30(a6)        ;FindTagItem
  486.         tst.l    d0
  487.         beq    OpenFailed11
  488.         move.l    d0,a1
  489.         moveq    #0,d0
  490.         move.w    conBLTWidth(a2),d0
  491.         move.l    d0,ti_Data(a1)
  492.  
  493.  
  494. ; Everything is OK
  495.  
  496.         movem.l    (sp)+,d2-d7/a2-a6
  497.         moveq    #0,d0
  498.         rts
  499.  
  500. ; An error occurred
  501.  
  502. OpenFailed    movem.l    (sp)+,d2-d7/a2-a6
  503.         moveq    #-1,d0
  504.         rts
  505.  
  506. OpenFailed1
  507.         bra.s    OpenFailed
  508.  
  509. OpenFailed2
  510.         bra.s    OpenFailed
  511.  
  512. OpenFailed3
  513.         bra.s    OpenFailed
  514.  
  515. OpenFailed4
  516.         bra.s    OpenFailed
  517.  
  518. OpenFailed5
  519.         lea    err5(pc),a0
  520.         bra.s    doerr
  521.  
  522. OpenFailed6
  523.         lea    err6(pc),a0
  524.         bra.s    doerr
  525.  
  526. OpenFailed7
  527.         lea    err7(pc),a0
  528.         bra.s    doerr
  529.  
  530. OpenFailed8
  531.         lea    err8(pc),a0
  532.         bra.s    doerr
  533.  
  534. OpenFailed9
  535.         lea    err9(pc),a0
  536.         bra.s    doerr
  537.  
  538. OpenFailed10
  539.         lea    err10(pc),a0
  540.         bra.s    doerr
  541.  
  542. OpenFailed11
  543.         lea    err11(pc),a0
  544.         bra.s    doerr
  545.  
  546. OpenFailed12
  547.         lea    err12(pc),a0
  548.         bra.s    doerr
  549.  
  550. OpenFailed13
  551.         lea    err13(pc),a0
  552.         bra.s    doerr
  553.  
  554.  
  555. ; Show error message
  556.  
  557.         nop
  558. doerr        bsr.s    doreq
  559.         bra    OpenFailed
  560.  
  561. doreq        movem.l    d0-a6,-(a7)
  562.         move.l    conIntBase(a2),a6
  563.         lea    easyreq(pc),a1
  564.         move.l    a0,es_TextFormat(a1)
  565.         suba.l    a0,a0
  566.         suba.l    a2,a2
  567.         suba.l    a3,a3
  568.         jsr    -588(a6)    ;EasyRequestArgs
  569.         movem.l    (a7)+,d0-a6
  570.         rts
  571.  
  572.  
  573. *
  574. * The CloseScreen routine
  575. * a0: Taglist with input parameters
  576. * a1: Taglist with output parameters
  577. * a2: Context pointer (never NULL)
  578. * a6: Base of utility.library
  579. *
  580.  
  581. MyCloseScreen
  582.         movem.l    d2-d7/a2-a6,-(sp)
  583.  
  584. ; Close the screen
  585.  
  586.         move.l    conScreen(a2),d0
  587.         beq.s    NoScreen
  588.         move.l    d0,a0
  589.         move.l    conIntBase(a2),a6
  590.         jsr    -66(a6)        ;CloseScreen
  591. NoScreen
  592.  
  593.  
  594. ; Close dos.library
  595.         move.l    conDOSBase(a2),d0
  596.         beq.s    nodos
  597.         move.l    d0,a1
  598.         move.l    4,a6
  599.         jsr    -414(a6)    ;CloseLibrary
  600. nodos
  601.  
  602. ; Close graphics.library
  603.         move.l    conGfxBase(a2),d0
  604.         beq.s    nogfx
  605.         move.l    d0,a1
  606.         move.l    4,a6
  607.         jsr    -414(a6)    ;CloseLibrary
  608. nogfx
  609.  
  610. ; Close intuition.library
  611.         move.l    conIntBase(a2),d0
  612.         beq.s    noint
  613.         move.l    d0,a1
  614.         move.l    4,a6
  615.         jsr    -414(a6)    ;CloseLibrary
  616. noint
  617.  
  618. ; Close expansion.library
  619.         move.l    conExpBase(a2),d0
  620.         beq.s    noexp
  621.         move.l    d0,a1
  622.         move.l    4,a6
  623.         jsr    -414(a6)    ;CloseLibrary
  624. noexp
  625.  
  626. ; Free context
  627.         move.l    4,a6
  628.         move.l    a2,a1
  629.         jsr    -690(a6)    ;FreeVec
  630.  
  631. CloseDone    movem.l    (sp)+,d2-d7/a2-a6
  632.         moveq    #0,d0
  633.         rts
  634.  
  635.  
  636. ; Library names
  637.  
  638. UtilityName    dc.b    "utility.library",0
  639. IntName        dc.b    "intuition.library",0
  640. GfxName        dc.b    "graphics.library",0
  641. DOSName        dc.b    "dos.library",0
  642. ExpName        dc.b    "expansion.library",0
  643.  
  644. ; The name of our screen
  645.  
  646. ScreenName    dc.b    "ShapeShifter Screen",0
  647.         CNOP    0,4
  648.  
  649. ; Taglist for OpenScreen()
  650.  
  651. ScreenTags    dc.l    SA_Depth
  652. ScrDepth    dc.l    0
  653.         dc.l    SA_Width
  654. ScrWidth    dc.l    0
  655.         dc.l    SA_Height
  656. ScrHeight    dc.l    0
  657.         dc.l    SA_DisplayID
  658. ScrDisplayID    dc.l    0
  659.         dc.l    SA_Overscan
  660. ScrOverscan    dc.l    0
  661.         dc.l    SA_Quiet,-1
  662.         dc.l    SA_Exclusive,-1
  663.         dc.l    SA_Title,ScreenName
  664.         dc.l    TAG_END,0
  665.  
  666.  
  667. ; Bad news...
  668.  
  669. easyreq        dc.l    EasyStruct_SIZEOF
  670.         dc.l    0
  671.         dc.l    er1
  672.         dc.l    0
  673.         dc.l    er2
  674.  
  675. er1        dc.b    "SD64evd Problem:",0
  676. er2        dc.b    "Bye!",0
  677.  
  678. err1
  679. err2
  680. err3
  681. err4
  682. err5        dc.b    "You must set color depth 24 bit",0
  683. err6        dc.b    "Can't find TagItem RefreshType",0
  684. err7        dc.b    "This driver supports only these Screen Modes:",$a,$a
  685.         dc.b    "512 x 384 x 24 bit",$a
  686.         dc.b    "576 x 432 x 24 bit",$a
  687.         dc.b    "640 x 400 x 24 bit",$a
  688.         dc.b    "640 x 480 x 24 bit (only with 4 Meg SD64)",$a
  689.         dc.b    "768 x 576 x 24 bit (only with 4 Meg SD64)",$a
  690.         dc.b    "800 x 600 x 24 bit (only with 4 Meg SD64)",$a
  691.         dc.b    "832 x 624 x 24 bit (only with 4 Meg SD64)",0
  692. err8        dc.b    "This Screen Mode requires 4 Meg SD64",0
  693. err9        dc.b    "OpenScreen failed",0
  694. err10        dc.b    "Can't find TagItem ScreenBase",0
  695. err11        dc.b    "Can't find TagItem BytesPerRow",0
  696. err12        dc.b    "Can't open expansion.library",$a
  697.         dc.b    "Are you sure you are using an Amiga?",0
  698. err13        dc.b    "You don't have a PiccoloSD64",$a
  699.         dc.b    "or your board has some problems",0
  700.  
  701.  
  702.         END
  703.